#ifndef __IO_H
#define __IO_H

#ifdef __cplusplus
extern "C" {
#endif

#include "at32f435_437.h"

#define I2C_TIMEOUT                      0xFFFFFFF

#define I2Cx_CLKCTRL                   0xB170FFFF   //10K
//#define I2Cx_CLKCTRL                   0xC0E06969   //50K
//#define I2Cx_CLKCTRL                     0x80504C4E   //100K
//#define I2Cx_CLKCTRL                   0x30F03C6B   //200K

#define I2Cx_ADDRESS                     0x15

#define I2Cx_PORT                        I2C2
#define I2Cx_CLK                         CRM_I2C2_PERIPH_CLOCK
#define I2Cx_DMA                         DMA1
#define I2Cx_DMA_CLK                     CRM_DMA1_PERIPH_CLOCK

#define I2Cx_SCL_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK
#define I2Cx_SCL_GPIO_PIN                GPIO_PINS_10
#define I2Cx_SCL_GPIO_PinsSource         GPIO_PINS_SOURCE10
#define I2Cx_SCL_GPIO_PORT               GPIOB
#define I2Cx_SCL_GPIO_MUX                GPIO_MUX_4

#define I2Cx_SDA_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK
#define I2Cx_SDA_GPIO_PIN                GPIO_PINS_11
#define I2Cx_SDA_GPIO_PinsSource         GPIO_PINS_SOURCE11
#define I2Cx_SDA_GPIO_PORT               GPIOB
#define I2Cx_SDA_GPIO_MUX                GPIO_MUX_4

#define I2Cx_DMA_TX_Channel              DMA1_CHANNEL1
#define I2Cx_DMA_TX_DMAMUX_Channel       DMA1MUX_CHANNEL1
#define I2Cx_DMA_TX_DMAREQ               DMAMUX_DMAREQ_ID_I2C2_TX
#define I2Cx_DMA_TX_IRQn                 DMA1_Channel1_IRQn

#define I2Cx_DMA_RX_Channel              DMA1_CHANNEL2
#define I2Cx_DMA_RX_DMAMUX_Channel       DMA1MUX_CHANNEL2
#define I2Cx_DMA_RX_DMAREQ               DMAMUX_DMAREQ_ID_I2C2_RX
#define I2Cx_DMA_RX_IRQn                 DMA1_Channel2_IRQn

#define I2Cx_EVT_IRQn                    I2C2_EVT_IRQn
#define I2Cx_ERR_IRQn                    I2C2_ERR_IRQn

#define BUF_SIZE                         8


#define EG1151_EN()     gpio_bits_reset(GPIOC,GPIO_PINS_0)
#define EG1151_DIS()    gpio_bits_set(GPIOC,GPIO_PINS_0)

#define KEYL_READ()     (gpio_input_data_bit_read(GPIOB,GPIO_PINS_6) != SET)
#define KEYM_READ()     (gpio_input_data_bit_read(GPIOB,GPIO_PINS_7) != SET)
#define KEYR_READ()     (gpio_input_data_bit_read(GPIOB,GPIO_PINS_9) != SET)

#define BEEP_ON()       gpio_bits_set(GPIOA,GPIO_PINS_8)
#define BEEP_OFF()      gpio_bits_reset(GPIOA,GPIO_PINS_8)

#define LED_ON()        gpio_bits_reset(GPIOC,GPIO_PINS_13)
#define LED_OFF()       gpio_bits_set(GPIOC,GPIO_PINS_13)
#define LED_TOG()       GPIOC->odt ^= GPIO_PINS_13

#define LED_IS_ON()     ((gpio_output_data_bit_read(GPIOC,GPIO_PINS_13) == 0x00)?1:0)

#define F_CS_H()        gpio_bits_set(GPIOD,GPIO_PINS_2)
#define F_CS_L()        gpio_bits_reset(GPIOD,GPIO_PINS_2)

#define SD_CS_H()       gpio_bits_set(GPIOB,GPIO_PINS_12)
#define SD_CS_L()       gpio_bits_reset(GPIOB,GPIO_PINS_12)

#define SD_INS_READ()   ((gpio_input_data_bit_read(GPIOH,GPIO_PINS_3) == 0x00)?1:0)

#define ADC_CHANNEL_NUM     4
#define ADC_FILT_NUM        500
extern __IO uint16_t adc1_ordinary_valuetab[];
extern __IO uint16_t dma_trans_complete_flag;

void io_drv_init(void);
void adc_drv_init(void);
void dac_drv_init(void);
void spi_drv_init(void);
void tmr_drv_init(void);
void can_drv_init(void);
void iic_drv_init(void);

#define ENC_CODE_IDLE       0x00
#define ENC_CODE_LEFT       0x01
#define ENC_CODE_RIGHT      0x02
#define ENC_CODE_CLICK      0x03
#define ENC_CODE_D_CLICK    0x04
#define ENC_CODE_L_CLICK    0x05
#define ENC_CODE_T_CLICK    0x06

#define CODE_NONE               (0x00)
#define CODE_CLICK              (0x01)
#define CODE_D_CLICK            (0x02)
#define CODE_L_CLICK            (0x03)
#define CODE_T_CLICK            (0x04)

#define KEYA_CODE   0x01
#define KEYB_CODE   0x02
#define KEYD_CODE   0x04

extern __IO uint8_t func_key_fun;
extern __IO uint8_t enc_code[2];

#define ENC1_A_READ()   ((gpio_input_data_bit_read(GPIOB,GPIO_PINS_2) == 0x00)?1:0)
#define ENC1_B_READ()   ((gpio_input_data_bit_read(GPIOB,GPIO_PINS_2) == 0x00)?1:0)
#define ENC1_Z_READ()   ((gpio_input_data_bit_read(GPIOA,GPIO_PINS_2) == 0x00)?1:0)

#define ENC1_READ()     (ENC1_A_READ()|(ENC1_B_READ()<<1))

#define FUNC_KEY_READ()     ENC1_Z_READ()
#define FUNC_KEY_ACTIVE     1
#define FUNC_KEY_CLEAR()    func_key_fun = CODE_NONE
#define FUNC_KEY_GET()      func_key_fun
#define BUTTON_GET()        button_code

#define LCD_BL_SET(x)       tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_4, x * 100)

void Key_Init(void);
void Button_handle(void);
uint8_t Check_enc(void);

int16_t enc_flag_get(void);

void can_transmit_data(uint8_t * buf);


#ifdef __cplusplus
}
#endif

#endif
